﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using KacincisinProject.Data;
using KacincisinProject.ViewModels;

namespace KacincisinProject.Controllers
{
    public class SoruKategoriController : Controller
    {
        readonly KacincisinDBEntities _db = new KacincisinDBEntities();
        //
        // GET: /SoruKategori/

        public ActionResult SoruKategorisiListele()
        {
            List<SoruKategorileri> soruKategorileri = _db.SoruKategorileri.ToList();
            return View(soruKategorileri);
        }

        public ActionResult SoruKategorisiOlustur()
        {
            return View();
        }

        [HttpPost]
        public ActionResult SoruKategorisiOlustur(SoruKategorileriViewModel model)
        {
            if (ModelState.IsValid)
            {
                var soruKategorileri = new SoruKategorileri
                    {
                        SoruKategoriAdi = model.SoruKategoriAdi
                    };

                _db.SoruKategorileri.Add(soruKategorileri);
                _db.SaveChanges();

                return RedirectToAction("SoruKategorisiListele");
            }

            return View(model);
        }

        public ActionResult SoruKategorisiDüzenle(int id)
        {
            var soruKategorisi = _db.SoruKategorileri.Find(id);

            var model = new SoruKategorileriViewModel
                {
                    SoruKategoriId = soruKategorisi.SoruKategoriId,
                    SoruKategoriAdi = soruKategorisi.SoruKategoriAdi
                };

            return View(model);
        }

        [HttpPost]
        public ActionResult SoruKategorisiDüzenle(SoruKategorileriViewModel model)
        {
            if (ModelState.IsValid)
            {
                var soruKategorileri = new SoruKategorileri
                    {
                        SoruKategoriId = model.SoruKategoriId,
                        SoruKategoriAdi =  model.SoruKategoriAdi
                    };
                _db.Entry(soruKategorileri).State = EntityState.Modified;
                _db.SaveChanges();
                return RedirectToAction("SoruKategorisiListele");
            }
            return View(model);
        }
        
        public ActionResult SoruKategorisiSil(int id)
        {
            var soruKategorisi = _db.SoruKategorileri.Find(id);

            if (soruKategorisi == null || soruKategorisi.Sorular.Any())
            {
                return RedirectToAction("SoruKategorisiListele");
            }

            var model = new SoruKategorileriViewModel
                {
                    SoruKategoriId = soruKategorisi.SoruKategoriId,
                    SoruKategoriAdi = soruKategorisi.SoruKategoriAdi
                };

            return View(model);
        }

        [HttpPost]
        public ActionResult SoruKategorisiSil(SoruKategorileriViewModel model)
        {
            if (ModelState.IsValid)
            {
                var soruKategorileri = new SoruKategorileri
                    {
                        SoruKategoriId = model.SoruKategoriId,
                        SoruKategoriAdi = model.SoruKategoriAdi
                    };

                _db.Entry(soruKategorileri).State = EntityState.Deleted;
                _db.SaveChanges();
                return RedirectToAction("SoruKategorisiListele");
            }

            return View(model);
        }


        public ActionResult KategoriEkle()
        {
            ViewBag.AnaKategoriler = new SelectList(_db.SoruKategorileri.Where(item => item.RelatedId == null).ToList(), "SoruKategoriId", "SoruKategoriAdi");

            return View();
        }

        [HttpPost]
        public JsonResult KategoriEkle(SoruKategorileriViewModel model)
        {
            List<AltKategori> list = new List<AltKategori>();


            if(ModelState.IsValid)
            {
                SoruKategorileri yenikategori=new SoruKategorileri();
                yenikategori.SoruKategoriAdi = model.SoruKategoriAdi;
                yenikategori.RelatedId = model.RelatedId;
                try
                {
                    _db.SoruKategorileri.Add(yenikategori);
                    _db.SaveChanges();
                    return Json("success");
                }
                catch (Exception)
                {

                    return Json("");
                }

           
            }
            return Json("");
        }
        [HttpPost]
        public JsonResult KategoriGetir(int RelatedId)
        {
            //1.Yöntem
            List<SoruKategorileriJson> soruKategorileri =
                _db.SoruKategorileri.Where(item => item.RelatedId == RelatedId).Select(
                    item =>
                    new SoruKategorileriJson() { SoruKategoriId = item.SoruKategoriId, SoruKategoriAdi = item.SoruKategoriAdi }).ToList();
            
            //2.Yöntem
            //List<SoruKategorileri> soruKategorileri = _db.SoruKategorileri.Where(item => item.RelatedId == RelatedId).ToList();

            //List<SoruKategorileriJson> soruKategorileriJson = new List<SoruKategorileriJson>();

            //foreach (var merve in soruKategorileri)
            //{
            //    SoruKategorileriJson yeni = new SoruKategorileriJson();
            //    yeni.SoruKategoriId = merve.SoruKategoriId;
            //    yeni.SoruKategoriAdi = merve.SoruKategoriAdi;
            //    soruKategorileriJson.Add(yeni);
            //}

            return Json(soruKategorileri);
        }

#region DYNATREE(AĞAÇ YAPISI)
        public JsonResult KategoriAgaciGetir()
        {
            List<SoruKategorileri> soruKategorileri = _db.SoruKategorileri.Where(item => item.RelatedId == null).ToList();

            List<Kategoriler> categories = soruKategorileri.Select(item => ConvertToNewCategories(item)).ToList();
            return Json(categories);
        }
        
        
        
        public Kategoriler ConvertToNewCategories(SoruKategorileri veriTabanindakiSoruKategorisi)  //Recursive Method 
        {

            //veriTabanindakiSoruKategorisi.SoruKategoriId;
            //veriTabanindakiSoruKategorisi.SoruKategoriAdi;
            //veriTabanindakiSoruKategorisi.RelatedId;

            //List<SoruKategorileri> soruKategorileris = veriTabanindakiSoruKategorisi.SoruKategorileri1.ToList();

            //SoruKategorileri soruKategorileri2 = veriTabanindakiSoruKategorisi.SoruKategorileri2;

            Kategoriler nc = new Kategoriler { key = veriTabanindakiSoruKategorisi.SoruKategoriId.ToString(), title = veriTabanindakiSoruKategorisi.SoruKategoriAdi };

            if (veriTabanindakiSoruKategorisi.SoruKategorileri1.Any())
            {
                nc.icon = null;
            }
            else
            {
                nc.icon = false;
            }

           

            nc.children.AddRange(veriTabanindakiSoruKategorisi.SoruKategorileri1.Select( item => ConvertToNewCategories(item) ));

            return nc;
        }

#endregion
        [HttpPost]
        public JsonResult KategoriDegistir(int kategoriId, string yeniKategoriAdi)
        {
            SoruKategorileri soruKategorileri = _db.SoruKategorileri.Find(kategoriId);
            if(soruKategorileri!=null)
            {
                soruKategorileri.SoruKategoriAdi = yeniKategoriAdi;
                _db.Entry(soruKategorileri).State=EntityState.Modified;
                _db.SaveChanges();
                return Json("success");
            }
            return Json("");
        }






    }
    public class AltKategori
    {
        public int Id { get; set; }
        public string Adi { get; set; }
    }

    public class SoruKategorileriJson
    {
        public int SoruKategoriId { get; set; }
        public string SoruKategoriAdi { get; set; }
    }

    public class Kategoriler
    {
        public string title { get; set; }
        public string key { get; set; }
        public string url { get; set; }
        public bool? icon { get; set; }
        //public int key { get; set; }
        //public bool isFolder { get; set; }
        //public bool isLazy { get; set; }
        //public string tooltip { get; set; }

        private List<Kategoriler> _children;

        public Kategoriler()
        {
            _children = new List<Kategoriler>();
        }

        public List<Kategoriler> children { get { return _children; } }
    }
   
     
}
